//
// Created by 沈昊 on 2021/12/6.
//
#include <Network/Buffer.h>
#include <Network/TcpServer.h>
#include <Poller/EventPoller.h>
#include <Thread/WorkThreadPool.h>
#include <Util/logger.h>
using namespace toolkit;
class echo_session : public toolkit::TcpSession {
public:
  echo_session(const Socket::Ptr &sock) : toolkit::TcpSession(sock) {}

public:
  virtual void onRecv(const Buffer::Ptr &buf) {
    InfoL << buf->data();
    auto buf_ptr(buf);
    send(buf_ptr);
  }

  /**
   * 收到 eof 或其他导致脱离 Server 事件的回调
   * 收到该事件时, 该对象一般将立即被销毁
   * @param err 原因
   */
  virtual void onError(const SockException &err) {}

  /**
   * 每隔一段时间触发, 用来做超时管理
   */
  virtual void onManager() {}
};
int main() {
  signal(SIGPIPE, [](int) {});
  Logger::Instance();
  Logger::Instance().add(std::make_shared<ConsoleChannel>());
  Logger::Instance().setWriter(std::make_shared<AsyncLogWriter>());
  EventPollerPool &pool = EventPollerPool::Instance();

  std::shared_ptr<TcpServer> server(new TcpServer(pool.getFirstPoller()));

  server->start<echo_session>(9000);
  //退出程序事件处理
  static semaphore sem;
  signal(SIGINT, [](int) { sem.post(); }); // 设置退出信号
  sem.wait();
  return 0;
}